package com.youxiake.lock;

import org.openjdk.jol.info.ClassLayout;

/**
 * 重量级锁（Synchronized）--可重入性（递归锁）
 * @author jxbai
 * @date 2021/12/14
 */
public class SynchronizedReentrantDemo implements Runnable {

    @Override
    public void run() {
        set();
    }

    /**
     * synchronized：this锁 是什么时候释放锁？ 代码结束后
     * set 和 get 都是this锁，set方法的锁没有释放，如果不可重入，
     * 无法获取get方法的锁，会产生死锁
     */
/*    public synchronized void set(){
        System.out.println("set方法");
        get();
    }*/

    public void set(){
        synchronized(this) {
            System.out.println("set方法");
            get();
        }
    }

/*    public synchronized void get(){
        System.out.println("synchronized 可以具备可冲入性 -- get方法");
    }*/

    public void get(){
        synchronized (this) {
            System.out.println("synchronized 可以具备可冲入性 -- get方法");
        }
    }

    public static void main(String[] args) {
        SynchronizedReentrantDemo demo = new SynchronizedReentrantDemo();
        new Thread(demo).start();
        // 查看对象布局
        System.out.println(ClassLayout.parseInstance(demo).toPrintable());
    }
}
